/*
 * widget.h
 *
 *  Created on: 2021年3月23日
 *      Author: root
 */

#ifndef GUI_WIDGET_H_
#define GUI_WIDGET_H_
#include <common/types.h>
#include <common/graphicscontext.h>
#include <drivers/keyboard.h>
#include <drivers/mouse.h>


namespace myos{
	namespace gui{
		class Widget:public myos::drivers::KeyboardEventHandle{
		protected:
			Widget* parent;
			myos::common::int32_t x;
			myos::common::int32_t y;
			myos::common::int32_t w;
			myos::common::int32_t h;

			myos::common::uint8_t r;
			myos::common::uint8_t g;
			myos::common::uint8_t b;
			bool Focussable;


		public:
			Widget(Widget* parent,
					myos::common::int32_t x,myos::common::int32_t y,myos::common::int32_t w,myos::common::int32_t h,
					myos::common::uint8_t r,myos::common::uint8_t g,myos::common::uint8_t b);
			~Widget();

			virtual void GetFocus(Widget* widget);
			virtual void ModelToScreen(myos::common::int32_t &x,myos::common::int32_t &y);

			virtual void Draw(myos::common::GraphicsContext* gc);
			virtual void OnMouseDown(myos::common::int32_t x,myos::common::int32_t y,myos::common::uint8_t button);
			virtual bool ContainsCoordinate(myos::common::int32_t x,myos::common::int32_t y);
			virtual void OnMouseUP(myos::common::int32_t x,myos::common::int32_t y,myos::common::uint8_t button);
			virtual void OnMouseMove(myos::common::int32_t oldx,myos::common::int32_t oldy,myos::common::int32_t newx,myos::common::int32_t newy);

		};

		class CompositeWidget:public Widget
		{
		private:
			Widget* children[100];
			int numChildren;
			Widget* focussedChild;
		public:
			CompositeWidget(Widget* parent,
					myos::common::int32_t x,myos::common::int32_t y,myos::common::int32_t w,myos::common::int32_t h,
					myos::common::uint8_t r,myos::common::uint8_t g,myos::common::uint8_t b);
			~CompositeWidget();

			virtual void GetFocus(Widget* widget);
			virtual bool AddChild(Widget* child);

			virtual void Draw(myos::common::GraphicsContext* gc);
			virtual void OnMouseDown(myos::common::int32_t x,myos::common::int32_t y,myos::common::uint8_t button);
			virtual void OnMouseUP(myos::common::int32_t x,myos::common::int32_t y,myos::common::uint8_t button);
			virtual void OnMouseMove(myos::common::int32_t oldx,myos::common::int32_t oldy,myos::common::int32_t newx,myos::common::int32_t newy);


			virtual void OnKeyDown(char str);
			virtual void OnKeyUP(char str);


		};
	}
}



#endif /* GUI_WIDGET_H_ */
